package com.qingcheng.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import com.qingcheng.pojo.goods.Category;
import com.qingcheng.pojo.goods.Sku;
import com.qingcheng.pojo.order.OrderItem;
import com.qingcheng.service.goods.CategoryService;
import com.qingcheng.service.goods.SkuService;
import com.qingcheng.service.order.CartService;
import com.qingcheng.util.CacheKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Reference
    private CategoryService categoryService;

    @Reference
    private SkuService skuService;


    @Override
    public List<Map<String, Object>> findCartList(String username) {
        System.out.println("从redis中提取购物车" + username);
        List<Map<String, Object>> cartList =
                    (List<Map<String, Object>>)redisTemplate.boundHashOps(CacheKey.CART_LIST).get(username);
        if (cartList == null) {
            return new ArrayList<>();
        }
        return cartList;
    }

    @Override
    public void addItem(String username, String skuId, Integer num) {
//实现思路： 遍历购物车，如果购物车中存在该商品则累加数量，如果不存在则 添加购物车项
        // 获取购物车
        List<Map<String, Object>> cartList = findCartList(username);
        boolean flag = false;
        //是否在购物车中存在
        for (Map map : cartList) {
            OrderItem orderItem = (OrderItem) map.get("item");
            if (orderItem.getSkuId().equals(skuId)) {
                //购物车存在该商品
                if (orderItem.getNum() <= 0) {
                    //如果数量小于等于0
                    cartList.remove(map);
                    //购物车项删除
                    break;
                }
                int weight = orderItem.getWeight() / orderItem.getNum();
                //单个商品重量
                orderItem.setNum(orderItem.getNum() + num);
                //数量累加
                orderItem.setMoney(orderItem.getNum() * orderItem.getPrice());
                //金额计算
                orderItem.setWeight(weight * orderItem.getNum());
                //重量计 算
                if (orderItem.getNum() <= 0) {
                    //如果数量小于等于0
                    cartList.remove(map);
                    //购物车项删除

                }
                flag = true;
                break;
            }
            //如果购物车中没有该商品，则添加
            if (flag == false) {
                Sku sku = skuService.findById(skuId);
                if (sku == null) {
                    throw new RuntimeException("商品不存在");
                }
                if (!"1".equals(sku.getStatus())) {
                    throw new RuntimeException("商品状态不合法");
                }
                if (num <= 0) {
                    //数量不能为0或负数
                    throw new RuntimeException("商品数量不合法");
                }
                OrderItem orderItem1 = new OrderItem();
                orderItem1.setSkuId(skuId);
                orderItem1.setSpuId(sku.getSpuId());
                orderItem1.setNum(num);
                orderItem1.setImage(sku.getImage());
                orderItem1.setPrice(sku.getPrice());
                orderItem1.setName(sku.getName());
                orderItem1.setMoney(orderItem.getPrice() * num);//金额计算
                if (sku.getWeight() == null) {
                    sku.setWeight(0);
                }
                orderItem.setWeight(sku.getWeight() * num); //重量计算
                //商品分类
                orderItem.setCategoryId3(sku.getCategoryId());
                Category category3 = (Category) redisTemplate.boundHashOps(CacheKey.CATEGORY).get(sku.getCategoryId());
                if (category3 == null) {
                    category3 = categoryService.findById(sku.getCategoryId());
                    //根据3级分类id查2级
                    redisTemplate.boundHashOps(CacheKey.CATEGORY).put(sku.getCategoryId(), category3);
                }
                orderItem.setCategoryId2(category3.getParentId());
                Category category2 = (Category) redisTemplate.boundHashOps(CacheKey.CATEGORY).get(category3.getParentId());
                if (category2 == null) {
                    category2 = categoryService.findById(category3.getParentId());
                    //根据2级分类id查询1级
                    redisTemplate.boundHashOps(CacheKey.CATEGORY).put(category3.getParentId(), category2);
                }
                orderItem.setCategoryId1(category2.getParentId());
                Map map1 = new HashMap();
                map1.put("item", orderItem);
                map1.put("checked", true);
                //默认选中
                cartList.add(map1);
            }
            redisTemplate.boundHashOps(CacheKey.CART_LIST).put(username, cartList);
        }
    }
}